leetcode
本系列前面的话
这段时间经历了一些事情,思考了很多,还有发现博客很久没写了,域名也因为没有续费被回收,想想博客还是要继续下去的,索性域名先不要了,等以后再换个好记的。
以前很少刷算法题,因为感觉工作中不会用到太多。其实到后来想想,原来是自己给自己的定位就是不写算法,因而找不到涉及算法的工作。现在趁着当前人工智能领域的浪潮,看看算法,顺便练习下Python
,希望可以赶上这波潮流。
题目:Two Sum
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
问题解析
问题很好理解,给出一个数组和target
,找出数组里相加之和为target
的两个数字的位置。
这里一个坑就是要注意负数
解决方案
暴力法
暴力方法很好想到,就是从数组第一个数字开始,依次循环往下加,直到加和等于target
。这是最简单的方法,也是复杂度很高的方法。
Java
代码:
public int[] twoSum(int[] nums, int target) {
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == target - nums[i]) {
return new int[] { i, j };
}
}
}
throw new IllegalArgumentException("No two sum solution");
}
Python
代码
class Solution:
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(len(nums) - 1):
for j in range(i + 1, len(nums)):
if nums[i] + nums[j] == target:
return [i, j]
return []
#if __name__ == "__main__":
# sol = Solution()
# results = sol.twoSum((3, 2, 4), 6)
# print("result is ", results)
Python
代码很暴力,但在leetcode
上运行最后一个丧心病狂的TestCase时花了7秒多,超出了规定时间,所以需要简单优化一下。
待续
复杂度
- 时间复杂度:O(n²).对每个元素,我们都要循环查找数组内的剩余元素,这需要O(n)的时间,所以整体运行下来需要O(n²)
- 空间复杂度:O(1).